/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Proyecto SIMOV
 * @author af.valbuena84
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

package webapplication1;
import java.util.ArrayList;

/**
 * Esta clase representa las vallas
 */
public class Valla 
{

    //-----------------------------------------------------------------
    // Atributos
    //-----------------------------------------------------------------

    /**
     * Es el identificador de la valla
     */
    private String identificador;

    /**
     * Es la colección de inforación que contiene  la valla
     */
    private ArrayList informacion;

    /**
     * Es la colección de arcos que une las vallas
     */
    private ArrayList<Arco> arcos;

    /**
     * Es la ubicación de las vallas
     */
    private String ubicacion;

    /**
     * Es la latitud donde se encuentra la valla
     */
    private double latitud;

    /**
     * Es la longitud donde se encuentra la valla
     */
    private double longitud;

    //-----------------------------------------------------------------
    // Constructores
    //-----------------------------------------------------------------

    /**
     * Crea una valla con la información básica.
     * @param nIdentificador identificador de la nueva valla.
     * @param nUbicación ubicación de la nueva valla
     * @param nLatitud latitud donde se encontrara la valla.
     * @param nLongitud longitud donde se encontrara la valla.
     * Se inicializan las colleciones arcos e información, esta ultima tiene formato!
     */
    public Valla(String nIdentificador, String nUbicacion, double nLatitud, double nLongitud )
    {
        identificador = nIdentificador;
        ubicacion = nUbicacion;
        latitud = nLatitud;
        longitud = nLongitud;

        arcos = new ArrayList<Arco>();
        informacion = new ArrayList();
    }

    //-----------------------------------------------------------------
    // Métodos
    //-----------------------------------------------------------------

    /**
     * retorna el identificador de la valla
     * @return identificador
     */
    public String darIdentificador() {
        return identificador;
    }

    /**
     * retorna la colección de inforacion que tiene la valla
     * @return the informacion
     */
    public ArrayList darInformacion() {
        return informacion;
    }

    /**
     * retorna la colección que tiene los arcos que conectan las vallas
     * @return arcos
     */
    public ArrayList<Arco> darArcos() {
        return arcos;
    }

    /**
     * retorna la ubicacion de la valla
     * @return ubicacion
     */
    public String darUbicacion() {
        return ubicacion;
    }

    /**
     * cambia la ubicacion de la valla por una nueva ubicacion
     * @param nUbicacion es la nueva ubicacion
     */
    public void cambiarUbicacion(String nUbicacion) {
        ubicacion = nUbicacion;
    }

    /**
     * retorna la latitud de la valla
     * @return latitud
     */
    public double darLatitud() {
        return latitud;
    }

    /**
     * cambia la latitud de la valla
     * @param nLatitud es la nueva latitud
     */
    public void cambiarLatitud(double nLatitud) {
        latitud = nLatitud;
    }

    /**
     * retorna la longitud de la valla
     * @return longitud
     */
    public double darLongitud() {
        return longitud;
    }

    /**
     * cambia la longitud de la valla
     * @param nLongitud nueva longitud
     */
    public void cabiarLongitud(double nLongitud) {
        longitud = nLongitud;
    }

    /**
     * Agrega un arco a la coleccion de arcos que tiene cada valla
     * @param arco es el arco a agregar
     * @return Resultado, es el reultado agregar el arco, "bien" en caso de agregar,
     * "mal" en caso de encontrar un arco con el miso identificador.
     */
    public String agregarArco(Arco arco)
    {
         String identificado = arco.darIdentificadorArco();
         if(buscarArcoIdentificador(identificado)== null)
         {
             arcos.add(arco);
             return "bien";
         }
         return "mal";
    }

    /**
     * Elimina un arco a la coleccion de arcos que tiene cada valla
     * @param indentificador es el identificador del arco a eliminar
     * @return Resultado, es el reultado de eliminar el arco, "bien" en caso de eliminarlo,
     * "mal" en caso de no encontrara arcos con ese identificador.
     */
    public String eliminarArco(String identificador)
    {
        for( int i = 0; i < arcos.size(); i++ )
        {
            Arco x = (Arco)arcos.get(i);
            if( x.darIdentificadorArco().equals( identificador ) )
            {
                arcos.remove(i);
                return "bien";
            }
        }
        return "mal";
    }
    
    /**
     * Este método sirve para buscar un Arco. <br>
     * <b>post: </b> Retorno un arco dado su identificador, si esta no existe se retorna null <br>
     * @param identificador Es el identificador del arco ue se está buscando - identificador!=null
     * @return arcoEncontrado - Retorna el arco buscado. Si el identificador no pertenece a ningun arco
     * entonces retorna null
     */
    public Arco buscarArcoIdentificador (String identificador)
    {
        Arco arcoEncontrado = null;
        boolean encontre = false;

        for( int i = 0; i < arcos.size() && !encontre; i++ )
        {
            Arco x = (Arco)arcos.get(i);
            if( x.darIdentificadorArco().equals( identificador ) )
            {
                arcoEncontrado = x;
                encontre = true;
            }
        }
        return arcoEncontrado;
    }
    
    /**
     * Agrega informacion a la coleccion de información que tiene cada valla
     * @param ninformacion es la inforacion a agregar
     */
    public void agregarInformación(String nInformacion)
    {
        informacion.add(nInformacion);
    }

    /**
     * cambiar información especifica de la valla
     * @param posicion posicion del arreglo que se quiere cambiar
     * @param nInforacion es la nueva informacion que tendra la valla
     * @return Resultado, es el reultado de cambiar la información, "bien" en caso de hacer el cambio,
     * "mal" en caso de no encontrara informacion a cambiar en esa posición.
     */
    public String cambiarInformacion(int posicion, String nInformacion)
    {
        if(informacion.get(posicion) != null)
        {
            informacion.set(posicion, nInformacion);
            return "bien";
        }
        return "mal";
    }

    /**
     * elimina información especifica de la valla
     * @param posicion posicion del arreglo que se quiere cambiar
     * @return Resultado, es el reultado de cambiar la información, "bien" en caso de eliminar la informacion,
     * "mal" en caso de no encontrara informacion a eliminar en esa posición.
     */
    public String eliminarInformacion (int posicion)
    {
        if(informacion.get(posicion) != null)
        {
            informacion.remove(posicion);
            return "bien";
        }
        return "mal";
    }
}
